import { def } from './utils.js';
import defineReactive from './defineReactive.js'
import { arrayMethods } from './arr.js'
import { observe } from './observe.js'
import Dep from './Dep.js'

//Observer  将一个正常的object转换为每个层级的属性都是响应式(可以被侦测)的object
export default class Observer {
    constructor(value) {
        //每个Observer的实例，成员中都有一个Dep的实例
        this.dep = new Dep();
        def(value, '__ob__', this, false);
        //检查它是数组还是对象
        if (Array.isArray(value)) {
            //如果是数组，将这个数组的原型，指向arrayMethods
            Object.setPrototypeOf(value, arrayMethods);
            //让这个数组变得observe
            this.observeArray(value);
        } else {
            this.walk(value);
        }
    }
    //遍历
    walk(value) {
        for (let key in value) {
            defineReactive(value, key);
        }
    }
    //数组特殊遍历
    observeArray(arr) {
        for (let i = 0; i < arr.length; i++) {
            observe(arr[i]);
        }
    }
};